package com.beta.cust.bind.datasync.dto;

import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

/**
 * 获取客户详情组装成该DTO<br>
 * 详情见：https://work.weixin.qq.com/api/doc/90000/90135/92114
 */

@NoArgsConstructor
@Data
public class ExternalCustInfoDTO {

    /**
     * 返回码
     */
    @JSONField(name = "errcode")
    private Integer errcode;

    /**
     * 对返回码的文本描述内容
     */
    @JSONField(name = "errmsg")
    private String errmsg;

    /**
     * 企业微信官方未说明该字段的意思
     */
    @JSONField(name = "external_contact")
    private ExternalContactDTO externalContact;

    /**
     * 企业微信官方未说明该字段的意思
     */
    @JSONField(name = "follow_user")
    private List<FollowUserDTO> followUser;

    /**
     * 分页的cursor，当跟进人多于500人时返回
     */
    @JSONField(name = "next_cursor")
    private String nextCursor;


    /**
     * 企业微信官方未说明该字段的意思
     */
    @NoArgsConstructor
    @Data
    public static class ExternalContactDTO {

        /**
         * 外部联系人的userid
         */
        @JSONField(name = "external_userid")
        private String externalUserid;

        /**
         * 外部联系人的名称
         */
        @JSONField(name = "name")
        private String name;

        /**
         * 外部联系人的职位，如果外部企业或用户选择隐藏职位，则不返回，仅当联系人类型是企业微信用户时有此字段
         */
        @JSONField(name = "position")
        private String position;

        /**
         * 外部联系人头像，代开发自建应用需要管理员授权才可以获取，第三方不可获取
         */
        @JSONField(name = "avatar")
        private String avatar;

        /**
         * 外部联系人所在企业的简称，仅当联系人类型是企业微信用户时有此字段
         */
        @JSONField(name = "corp_name")
        private String corpName;

        /**
         * 外部联系人所在企业的主体名称，仅当联系人类型是企业微信用户时有此字段
         */
        @JSONField(name = "corp_full_name")
        private String corpFullName;

        /**
         * 外部联系人的类型，1表示该外部联系人是微信用户，2表示该外部联系人是企业微信用户
         */
        @JSONField(name = "type")
        private Integer type;

        /**
         * 外部联系人性别 0-未知 1-男性 2-女性
         */
        @JSONField(name = "gender")
        private Integer gender;

        /**
         * 外部联系人在微信开放平台的唯一身份标识（微信unionid），通过此字段企业可将外部联系人与公众号/小程序用户关联起来。仅当联系人类型是微信用户，且企业或第三方服务商绑定了微信开发者ID有此字段
         */
        @JSONField(name = "unionid")
        private String unionid;

        /**
         * 外部联系人的自定义展示信息，可以有多个字段和多种类型，包括文本，网页和小程序，仅当联系人类型是企业微信用户时有此字段
         * 详情见：https://work.weixin.qq.com/api/doc/90000/90135/92230
         */
        @JSONField(name = "external_profile")
        private ExternalContactDTO.ExternalProfileDTO externalProfile;


        /**
         * 外部联系人的自定义展示信息，可以有多个字段和多种类型，包括文本，网页和小程序，仅当联系人类型是企业微信用户时有此字段
         * 详情见：https://work.weixin.qq.com/api/doc/90000/90135/92230
         */
        @NoArgsConstructor
        @Data
        public static class ExternalProfileDTO {

            /**
             * 企业微信官方未说明该字段的意思
             */
            @JSONField(name = "external_attr")
            private List<ExternalAttrDTO> externalAttr;

            /**
             * 企业微信官方未说明该字段的意思
             */
            @NoArgsConstructor
            @Data
            public static class ExternalAttrDTO {

                /**
                 * 企业微信官方未说明该字段的意思
                 */
                @JSONField(name = "type")
                private Integer type;

                /**
                 * 企业微信官方未说明该字段的意思
                 */
                @JSONField(name = "name")
                private String name;

                /**
                 * 企业微信官方未说明该字段的意思
                 */
                @JSONField(name = "text")
                private ExternalContactDTO.ExternalProfileDTO.ExternalAttrDTO.TextDTO text;

                /**
                 * 企业微信官方未说明该字段的意思
                 */
                @JSONField(name = "web")
                private ExternalContactDTO.ExternalProfileDTO.ExternalAttrDTO.WebDTO web;

                /**
                 * 企业微信官方未说明该字段的意思
                 */
                @JSONField(name = "miniprogram")
                private ExternalContactDTO.ExternalProfileDTO.ExternalAttrDTO.MiniprogramDTO miniprogram;


                /**
                 * 企业微信官方未说明该字段的意思
                 */
                @NoArgsConstructor
                @Data
                public static class TextDTO {

                    /**
                     * 企业微信官方未说明该字段的意思
                     */
                    @JSONField(name = "value")
                    private String value;
                }


                /**
                 * 企业微信官方未说明该字段的意思
                 */
                @NoArgsConstructor
                @Data
                public static class WebDTO {

                    /**
                     * 企业微信官方未说明该字段的意思
                     */
                    @JSONField(name = "url")
                    private String url;

                    /**
                     * 企业微信官方未说明该字段的意思
                     */
                    @JSONField(name = "title")
                    private String title;
                }


                /**
                 * 企业微信官方未说明该字段的意思
                 */
                @NoArgsConstructor
                @Data
                public static class MiniprogramDTO {

                    /**
                     * 企业微信官方未说明该字段的意思
                     */
                    @JSONField(name = "appid")
                    private String appid;

                    /**
                     * 企业微信官方未说明该字段的意思
                     */
                    @JSONField(name = "pagepath")
                    private String pagepath;

                    /**
                     * 企业微信官方未说明该字段的意思
                     */
                    @JSONField(name = "title")
                    private String title;
                }
            }
        }
    }


    /**
     * 企业微信官方未说明该字段的意思
     */
    @NoArgsConstructor
    @Data
    public static class FollowUserDTO {

        /**
         * 添加了此外部联系人的企业成员userid
         */
        @JSONField(name = "userid")
        private String userid;

        /**
         * 该成员对此外部联系人的备注
         */
        @JSONField(name = "remark")
        private String remark;

        /**
         * 该成员对此外部联系人的描述
         */
        @JSONField(name = "description")
        private String description;

        /**
         * 该成员添加此外部联系人的时间
         */
        @JSONField(name = "createtime")
        private Integer createtime;

        /**
         * 企业微信官方未说明该字段的意思
         */
        @JSONField(name = "tags")
        private List<TagsDTO> tags;

        /**
         * 该成员对此客户备注的企业名称
         */
        @JSONField(name = "remark_corp_name")
        private String remarkCorpName;

        /**
         * 该成员对此客户备注的手机号码，代开发自建应用需要管理员授权才可以获取，第三方不可获取
         */
        @JSONField(name = "remark_mobiles")
        private List<String> remarkMobiles;

        /**
         * 发起添加的userid，如果成员主动添加，为成员的userid；如果是客户主动添加，则为客户的外部联系人userid；如果是内部成员共享/管理员分配，则为对应的成员/管理员userid
         */
        @JSONField(name = "oper_userid")
        private String operUserid;

        /**
         * 该成员添加此客户的来源
         * 详情见：https://work.weixin.qq.com/api/doc/90000/90135/92114#%E6%9D%A5%E6%BA%90%E5%AE%9A%E4%B9%89
         */
        @JSONField(name = "add_way")
        private Integer addWay;

        /**
         * 企业自定义的state参数，用于区分客户具体是通过哪个「联系我」添加，由企业通过创建「联系我」方式指定
         */
        @JSONField(name = "state")
        private String state;

        /**
         * 企业微信官方未说明该字段的意思
         */
        @NoArgsConstructor
        @Data
        public static class TagsDTO {

            /**
             * 该成员添加此外部联系人所打标签的分组名称（标签功能需要企业微信升级到2.7.5及以上版本）
             */
            @JSONField(name = "group_name")
            private String groupName;

            /**
             * 该成员添加此外部联系人所打标签名称
             */
            @JSONField(name = "tag_name")
            private String tagName;

            /**
             * 该成员添加此外部联系人所打企业标签的id，用户自定义类型标签（type=2）不返回
             */
            @JSONField(name = "tag_id")
            private String tagId;

            /**
             * 该成员添加此外部联系人所打标签类型, 1-企业设置，2-用户自定义，3-规则组标签（仅系统应用返回）
             */
            @JSONField(name = "type")
            private Integer type;
        }
    }
}
